題目希望以順時針的方式重新整合陣列
Example 1:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
用 move 判斷現在是朝向左右移動或上下移動
設 x y 取值, y 是上下層第幾層 x 是左右第幾個元素
準備 result 裝螺旋轉出來的值
迴圈終止是當 result 的元素量等同於傳入陣列的所有元素
input1 =
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
output1 = [1,2,3,6,9,8,7,4,5]
input2 =
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
output2 = [1,2,3,4,8,12,11,10,9,5,6,7]
function sprial(ary){
let move = 'right' // 判斷移動方向
let x = 0
let y = 0
result = []
while(result.length != ary.length * ary[0].length ){
// result 陣列內元素與傳入陣列的元素一樣多時停止
el = ary[y][x]
result.push(el)
if(move === 'right'){ // 判斷現在移動的方向
if(ary[y][x+1] != undefined && result.indexOf(ary[y][x+1]) == -1){
// 處理移動到邊緣要轉彎
x += 1
}else{
move = 'down'
y += 1
}
}else if(move == 'down'){
if(ary[y+1] != undefined && result.indexOf(ary[y+1][x]) == -1){
y += 1
}else{
move = 'left'
x -= 1
}
}else if(move =='left'){
if(ary[y][x-1] !=undefined && result.indexOf(ary[y][x-1]) == -1){
x -= 1
}else{
move ='top'
y -= 1
}
}else if( move == 'top'){
if(ary[y-1] != undefined && result.indexOf(ary[y-1][x]) == -1){
// 轉到內圈的條件,遇到已經存在於 reuslt 的元素要往內轉
y -= 1
}else{
move = 'right'
x += 1
}
}
}
return result
}
function expect(a,b){
console.log( JSON.stringify(a) === JSON.stringify(b) )
}
expect(sprial(input1),output1)
expect(sprial(input2),output2)
這樣的寫法是把遇到邊緣該如何處理都加上去,有點冗長,如果傳入的陣列越大就需要判斷內圈的四個邊要如何往內轉
今天到此為止,有任何問題請在下方留言或透過email、GitHub聯絡我,感謝閱讀
Daily kitty